package com.nuts.base.bean;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

/**
 * 树结构VO
 * 
 * @author 许自辉
 * @date 2017年8月14日
 */
@Getter
@Setter
@ToString
public class PermissionTreeVO extends BaseTreeVO {
	private List<PermissionTreeVO> children;
	
	private String parentPaths;
	/**
	 * 是目录还是code,0目录，1code
	 */
	private Integer codeFlag;

	/**
	 * list生成树结构
	 */
	public static List<PermissionTreeVO> getTreeList(List<PermissionTreeVO> treeVOs) {
		List<PermissionTreeVO> rootTrees = new ArrayList<PermissionTreeVO>();
		for (PermissionTreeVO tree : treeVOs) {
			if (tree.getParentId() == 0) {
				rootTrees.add(tree);
			}
			for (PermissionTreeVO t : treeVOs) {
				if (t.getParentId() == tree.getId()) {
					if (tree.getChildren() == null) {
						List<PermissionTreeVO> myChildrens = new ArrayList<PermissionTreeVO>();
						myChildrens.add(t);
						tree.setChildren(myChildrens);
					} else {
						tree.getChildren().add(t);
					}
				}
			}
		}
		return rootTrees;
	}

	/**
	 * list生成树结构
	 */
	public static List<PermissionTreeVO> getDeptTree(List<PermissionTreeVO> treeVOs) {
		// 最后的结果
		List<PermissionTreeVO> menuList = new ArrayList<PermissionTreeVO>();
		// 先找到所有的一级菜单
		for (int i = 0; i < treeVOs.size(); i++) {
			// 一级菜单没有parentId
			if (treeVOs.get(i).getParentId() == 0) {
				menuList.add(treeVOs.get(i));
			}
		}
		// 为一级菜单设置子菜单，getChild是递归调用的
		for (PermissionTreeVO menu : menuList) {
			menu.setChildren(getChild(menu.getId(), treeVOs));
		}
		return menuList;
	}

	/**
	 * 递归查找子菜单
	 * 
	 * @param id
	 *            当前菜单id
	 * @param rootMenu
	 *            要查找的列表
	 * @return
	 */
	private static List<PermissionTreeVO> getChild(Integer id, List<PermissionTreeVO> rootMenu) {
		// 子菜单
		List<PermissionTreeVO> childList = new ArrayList<>();
		for (PermissionTreeVO menu : rootMenu) {
			// 遍历所有节点，将父菜单id与传过来的id比较
			if (StringUtils.isNotBlank(menu.getParentId() + "")) {
				if (menu.getParentId().equals(id)) {
					childList.add(menu);
				}
			}
		}
		// 把子菜单的子菜单再循环一遍
		for (PermissionTreeVO menu : childList) {// 没有url子菜单还有子菜单
			// 递归
			menu.setChildren(getChild(menu.getId(), rootMenu));
		} // 递归退出条件
		if (childList.size() == 0) {
			return null;
		}
		return childList;
	}

	/**
	 * 移除空的目录
	 */
	public static void removeNullTree(List<PermissionTreeVO> rootTrees) {
		if (!CollectionUtils.isEmpty(rootTrees)) {
			// 移除空的目录
			Predicate<PermissionTreeVO> predicate = (s) -> (s.children == null && s.codeFlag == 0);
			rootTrees.removeIf(predicate);
			rootTrees.forEach(s -> {
				if (s.getChildren() != null) {
					removeNullTree(s.getChildren());
					if (s.getChildren().size() == 0) {
						s.setChildren(null);
					}
				}
			});

			// 移除完子目录,如果当前目录为空,酒吧当前目录页移除
			if (!CollectionUtils.isEmpty(rootTrees)) {
				Predicate<PermissionTreeVO> predicate2 = (s2) -> (s2.children == null && s2.codeFlag == 0);
				rootTrees.removeIf(predicate2);
			}

		}
	}

}
